package com.lu.pojo.container;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;

/**
 * @author luzhenfang
 * @date 2020 07 04
 * @description HashSet
 *  - 具有良好的存取和查找性能
 *  - 特点
 *      - 无序
 *      - 不重复
 *          当我们向Set集合加入数据时，要加入的数据会和集合里的数据比较
 *          会先比较hashCode()的值，如果不同那么jvm就会认为这是两个不同的数据 就会直接加入，
 *          而如果hashCode()的值相同，jvm会调用equals()来比较，如果相同就认为是一个数据，否则 就是两个数据。
 */
public class TestSet {

    static class Student{
        private String id;
        private String name;

        public Student(String id, String name) {
            this.id = id;
            this.name = name;
        }
        @Override
        public String toString() {
            return "Student{" +
                    "id='" + id + '\'' +
                    ", name='" + name + '\'' +
                    '}';
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Student student = (Student) o;
            return Objects.equals(id, student.id);
        }

        @Override
        public int hashCode() {
            return Objects.hash(id);
        }
    }
    public static void main(String[] args) {
        HashSet<String> stringSet = new HashSet<>();
        stringSet.add("tom");
        stringSet.add("jack");
        stringSet.add("lucy");
        stringSet.add("tom");
        // set 的不重复特性
        System.out.println(stringSet);
        // 同样可以使用 迭代器
        Iterator<String> iterator = stringSet.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }


        // 这样set 就没法做到 不重复 。。
        HashSet<Student> objSet = new HashSet<>();
        objSet.add(new Student("1","jack"));
        objSet.add(new Student("1","jack"));
        objSet.add(new Student("2","tom"));
        System.out.println(objSet);
        // 解决方法 set 是 通过 hashcode 来计算储存位置的(不重复) 所以我们要重写  Student 类的 hashcode 方法
        // 通过 计算出的 hashcode 来 决定储存位置 同时我们也要写  equals 方法来 决定是 保留 元素还是舍弃元素

    }
}
